#include <xen/config.h>
#include <xen/init.h>
#include <xen/lib.h>
+#include <xen/trace.h>
#include <xen/sched.h>
#include <asm/current.h>
#include <asm/io.h>
}
#endif
+#define TRC_VMX_VMEXIT 0x00040001
+#define TRC_VMX_VECTOR 0x00040002
+
asmlinkage void vmx_vmexit_handler(struct xen_regs regs)
{
unsigned int exit_reason, idtv_info_field;
unsigned long exit_qualification, eip, inst_len = 0;
- struct exec_domain *d = current;
+ struct exec_domain *ed = current;
int error;
if ((error = __vmread(VM_EXIT_REASON, &exit_reason)))
VMX_DBG_LOG(DBG_LEVEL_0, "exit reason = %x\n", exit_reason);
if (exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY) {
- __vmread(EXIT_QUALIFICATION, &exit_qualification);
- __vmread(GUEST_EIP, &eip);
domain_crash();
return;
}
+ __vmread(GUEST_EIP, &eip);
+ TRACE_3D(TRC_VMX_VMEXIT, ed->domain->id, eip, exit_reason);
+
switch (exit_reason) {
case EXIT_REASON_EXCEPTION_NMI:
{
perfc_incra(cause_vector, vector);
+ TRACE_3D(TRC_VMX_VECTOR, ed->domain->id, eip, vector);
switch (vector) {
#ifdef XEN_DEBUGGER
case VECTOR_DB:
"eax=%lx, ebx=%lx, ecx=%lx, edx=%lx, esi=%lx, edi=%lx\n",
regs.eax, regs.ebx, regs.ecx, regs.edx, regs.esi,
regs.edi);
- d->arch.arch_vmx.vmx_platform.mpci.inst_decoder_regs = ®s;
+ ed->arch.arch_vmx.vmx_platform.mpci.inst_decoder_regs = ®s;
if (!(error = vmx_do_page_fault(va, error_code))) {
/*
VECTOR_PG);
__vmwrite(VM_ENTRY_INTR_INFO_FIELD, intr_fields);
__vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code);
- d->arch.arch_vmx.cpu_cr2 = va;
+ ed->arch.arch_vmx.cpu_cr2 = va;
}
break;
}
case EXIT_REASON_PENDING_INTERRUPT:
__vmwrite(CPU_BASED_VM_EXEC_CONTROL,
MONITOR_CPU_BASED_EXEC_CONTROLS);
- vmx_intr_assist(d);
+ vmx_intr_assist(ed);
break;
case EXIT_REASON_TASK_SWITCH:
__vmx_bug(®s);
__vmread(GUEST_EIP, &eip);
__vmread(EXIT_QUALIFICATION, &exit_qualification);
- vmx_print_line(regs.eax, d); /* provides the current domain */
+ vmx_print_line(regs.eax, ed); /* provides the current domain */
__update_guest_eip(inst_len);
break;
case EXIT_REASON_CR_ACCESS:
__vmx_bug(®s); /* should not happen */
}
- vmx_intr_assist(d);
+ vmx_intr_assist(ed);
return;
}